package Collection.stream;

import java.util.ArrayList;
import java.util.List;
import java.util.Random;
import java.util.stream.Collectors;

/**
 * JDK8之后，集合提供了流式操作，以流的处理思路完成对集合元素的操作
 * 集合提供了一个方法stream()，可以将集合转换成流，流中的内容就是集合中的每个元素
 * 我们可以在流中添加各种中间环节(相当于IO的高级流),每个中间环节都会将元素经过时进行相应的处理
 * 最后要在Stream上添加终端环节,用于得到最终的处理结果
 * 步骤:集合转为流->中间环节->终端环节(流转为集合)
 */
public class StreamApiDemo {
    public static void main(String[] args) {
        List<Integer> list=new ArrayList<>();
        Random rand =new Random();
        for (int i=0;i<10;i++){
            list.add(rand.nextInt(10));
        }
        System.out.println(list);
        /*
        常见的中间环节:
        1.map:
            map方法接收一个lambda表达式，将集合中每个元素都经历一次该表达式，并将表达式处理结果替换该元素
        2.filter:
            filter方法可以过滤流中的每个元素，仅保留符合lambda表达式要求的元素
        3.distinct:
            distinct方法可以过滤重复的元素
        4.sorted:
            sorted方法可以按照元素的大小进行排序,该方法接收一个lambda表达式用于顶骨Compare,默认升序
         */
        List <Integer> list2 =list.stream()//将集合变为一个"流"
                .map(e->e*3)//添加map中间环节，将每个元素扩大3倍,这是lambda表达式
                .collect(Collectors.toList());//终端环节，将流变为集合
        System.out.println(list2);
        //2.filter:保留集合中所有的偶数
        List<Integer> list3 =list.stream().filter(e->e%2==0).collect(Collectors.toList());
        System.out.println(list3);
        List<Integer> list4 =list.stream().distinct().collect(Collectors.toList());
        System.out.println(list4);
        List<Integer> list5 =list.stream().sorted((e1,e2)->e2-e1).collect(Collectors.toList());
        //对集合元素降序排列(e2-e1)
        System.out.println(list5);

        //对集合每个元素扩大3倍并获取其中所有的偶数然后去除集合重复元素并降序排列
        List<Integer> list6 =list.stream()
                .map(e->e*3)
                .filter(e->e%2==0)
                .distinct()
                .sorted((e1,e2)->e2-e1)
                .collect(Collectors.toList());
        System.out.println(list6);
    }
}
